/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package leitorescritorcomthread;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Pedro Ribeiro
 */
public class Cliente implements Runnable {

    private int idCliente;
    private static LeitorEscritor server;

    public static final boolean OP_ESCRITA = false;
    public static final boolean OP_LEITURA = true;

    public static int contadorDeCliente = 1;

    public int getIdCliente() {
        return idCliente;
    }

    public void setIdCliente(int idCliente) {
        this.idCliente = idCliente;
    }

    public Cliente() throws NotBoundException, MalformedURLException, RemoteException {
        //servidor único, var global
        
        server = (LeitorEscritor) Naming.lookup("rmi://localhost/Servidor_leitor_escritor");
        idCliente = contadorDeCliente;
        contadorDeCliente++;
    }

    @Override
    public String toString() {
        return "Cliente " + getIdCliente();
    }

    //Método aleatório que retorna uma String contendo uma comida
    public static String geraTexto() {

        String[] frutas = {"banana", "abacaxi", "pêra", "uva", "maçã", "manga", "laranja", "jabuticaba", "acerola", "tangerina"};//10
        String[] prato1 = {"arroz", "macarrão"};
        String[] prato2 = {"purê", "salada", "salpicão", "maionese", "batata frita"};
        String[] prato3 = {"frango", "carne", "peixe", "churrasco"};
        int tamanho;
        int tipoAlimento = (int) Math.round(Math.random() * 4);
        switch (tipoAlimento) {
            case 0:
                tamanho = frutas.length - 1;
                int indiceFrutaEscolhida = Integer.parseInt(Math.round((Math.random() * tamanho)) + "");
                return frutas[indiceFrutaEscolhida].toString();
            case 1:
                tamanho = prato1.length - 1;
                int indicePrato1Escolhido = Integer.parseInt(Math.round((Math.random() * tamanho)) + "");
                return prato1[indicePrato1Escolhido].toString();
            case 2:
                tamanho = prato2.length - 1;
                int indicePrato2Escolhido = Integer.parseInt(Math.round((Math.random() * tamanho)) + "");
                return prato2[indicePrato2Escolhido].toString();
            default:
                tamanho = prato3.length - 1;
                int indicePrato3Escolhido = Integer.parseInt(Math.round((Math.random() * tamanho)) + "");
                return prato3[indicePrato3Escolhido].toString();
        }
    }

    public boolean criaRequisicao() {
        double opcaoLeituraOuEscrita = Math.random();
        if (opcaoLeituraOuEscrita >= 0.5) {
            return OP_ESCRITA;
        } else {
            return OP_LEITURA;
        }
    }

    @Override
    public void run() {
        int numRequisicoes = 5;

        // Instala um gerenciador de seguranca para controlar a carga dinamica dos stubs
//        String url = "rmi://localhost/";

        // Especifica o nome do servidor e do objeto para obter um stub para acessar o objeto servidor
        System.setSecurityManager(new RMISecurityManager());

        for (int i = numRequisicoes; i > 0; i--) {
            boolean operacao = criaRequisicao();
            String texto = "";
            if (operacao == OP_ESCRITA) {
                texto = geraTexto();
            }
            try {
                server.receptorEProcessadorCliente(getIdCliente(), operacao, texto);
            } catch (RemoteException ex) {
                Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }

    public static void main(String[] args) {
        /*
         Uma vez instanciada, ela põem um cliente em cada thread e cada thread 
         chama o mesmo servidor
         */
        try {
            Cliente c1 = new Cliente();
            Cliente c2 = new Cliente();
            Cliente c3 = new Cliente();

            Thread t1 = new Thread(c1);
            Thread t2 = new Thread(c2);
            Thread t3 = new Thread(c3);

            t1.start();
            t2.start();
            t3.start();

         
        } catch (NotBoundException | MalformedURLException | RemoteException ex) {

        }

    }
}
